package com.peng.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.peng.dao.UserMapper;
import com.peng.entity.Permission;
import com.peng.dao.PermissionMapper;
import com.peng.entity.User;
import com.peng.service.PermissionService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.peng.utils.MenuTree;
import com.peng.vo.RolePermissionVo;
import com.peng.vo.query.PermissionQueryVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;

import javax.annotation.Resource;
import java.util.*;
import java.util.function.Consumer;

@Service
@Transactional
public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permission> implements PermissionService {

    @Resource
    private UserMapper userMapper;

    /**
     * 根据用户id查询权限菜单列表
     *
     * @param userId
     * @return
     */
    @Override
    public List<Permission> findPermissionListByUserId(Long userId) {
        return baseMapper.findPermissionListByUserId(userId);
    }

    /**
     * 查询菜单列表
     *
     * @param permissionQueryVo
     * @return
     */
    @Override
    public List<Permission> findPermissionList(PermissionQueryVo permissionQueryVo) {
        // 创建条件构造器对象
        QueryWrapper<Permission> queryWrapper = new QueryWrapper<>();
        // 设置排序字段
        queryWrapper.orderByAsc("order_num");
        // 调用查询菜单列表的方法
        List<Permission> permissionList = baseMapper.selectList(queryWrapper);
        // 生成菜单树
        List<Permission> menuTree = MenuTree.makeMenuTree(permissionList, 0L);
        return menuTree;
    }

    /**
     * 查询上级菜单列表
     *
     * @return
     */
    @Override
    public List<Permission> findParentPermissionList() {
        // 创建条件构造器对象
        QueryWrapper<Permission> queryWrapper = new QueryWrapper<>();
        // 只查询菜单和目录的数据
        queryWrapper.in("type", Arrays.asList(0, 1));
        // 设置排序字段
        queryWrapper.orderByAsc("order_num");
        // 调用查询菜单列表的方法
        List<Permission> permissionList = baseMapper.selectList(queryWrapper);
        // 构造顶级菜单数据对象
        Permission permission = new Permission();
        permission.setId(0L);
        permission.setParentId(-1L);
        permission.setLabel("顶级菜单");
        permissionList.add(permission);
        // 生成菜单数据
        List<Permission> menuTree = MenuTree.makeMenuTree(permissionList, -1L);
        return menuTree;
    }

    /**
     * 检测菜单是否有子菜单
     *
     * @param id
     * @return
     */
    @Override
    public boolean hasChildrenOfPermission(Long id) {
        QueryWrapper<Permission> queryWrapper = new QueryWrapper<>();
        // 查询父id
        queryWrapper.eq("parent_id", id);
        // 判断数量是否大于0，如果大于0表示存在
        if (baseMapper.selectCount(queryWrapper) > 0) {
            return true;
        }
        return false;
    }

    /**
     * 查询权限菜单树
     *
     * @param userId
     * @param roleId
     * @return
     */
    @Override
    public RolePermissionVo findPermissionTree(Long userId, Long roleId) {
        // 查询当前登录用户信息
        User user = userMapper.selectById(userId);
        List<Permission> list = null;
        // 判断当前用户是否是管理员 如果是管理员，则查询所有权限信息，如果不是管理员，则需要根据当前用户id查询出当前用户所拥有的权限信息
        if (user != null && !ObjectUtils.isEmpty(user.getIsAdmin()) && user.getIsAdmin() == 1) {
            //查询所有权限关系
            list = baseMapper.selectList(null);
        } else {
            // 根据当前用户id查询出当前用户所拥有的权限
            list = baseMapper.findPermissionListByUserId(userId);
        }
        // 将登录用户所拥有的权限封装成树
        List<Permission> permissionList = MenuTree.makeMenuTree(list, 0L);
        // 查询要分配角色拥有权限列表
        List<Permission> rolePermissions = baseMapper.findPermissionListByRoleId(roleId);
        // 创建集合保存权限id
        List<Long> listIds = new ArrayList<>();
        // 进行数据回显
        Optional.ofNullable(list).orElse(new ArrayList<>())
                .stream().filter(Objects::nonNull)
                .forEach(new Consumer<Permission>() {
                    @Override
                    public void accept(Permission item) {
                        Optional.ofNullable(rolePermissions).orElse(new ArrayList<>())
                                .stream()
                                .filter(Objects::nonNull)
                                .forEach(new Consumer<Permission>() {
                                    @Override
                                    public void accept(Permission obj) {
                                        // 判断两者权限id是否一致，如果一致则表示拥有该权限
                                        if (item.getId().equals(obj.getId())) {
                                            listIds.add(obj.getId());
                                            return;
                                        }
                                    }
                                });
                    }
                });
        RolePermissionVo rolePermissionVo = new RolePermissionVo();
        rolePermissionVo.setPermissionList(permissionList);
        rolePermissionVo.setCheckList(listIds.toArray());
        return rolePermissionVo;
    }

}
